This document is an interactive dashboard viewable from most modern internet browsers. The dashboard is a validation and diagnostics tool for CT-RAMP based Activity Based Models. Users can compare model performance against a household survey as part of a validation exercise or compare two model runs for sensitivity testing. All of the data, charts, and maps viewable in this dashboard are embedded directly into the HTML file. An internet connection is necessary for the best user experience, but is not required.
Users may navigate to different areas of the dashboard using the navigation bar at the top of the page, and may interact directly with most tables, charts, and maps.
This document is best viewed using the most recent versions of the following web browsers:
Note: Mozilla Firefox does not correctly render the images in this HTML file.
HTS
17,386,289
7,784,651
21,995,858
55,854,591
14,119,655
36,088,801
297,991,409
MODEL
22,226,197
9,196,862
30,891,183
79,767,033
17,984,667
52,057,544
417,066,994
HTS
MODEL
Average Mandatory Tour Lengths
| Home District | Work | University | School |
|---|---|---|---|
| Central Florida | 12.32 | 9.50 | 5.33 |
| Northeast Florida | 13.01 | 11.82 | 6.17 |
| Northwest Florida | 10.80 | 11.07 | 7.92 |
| South Florida | 10.79 | 7.27 | 4.38 |
| Southeast Florida | 12.89 | 8.66 | 4.68 |
| Southwest Florida | 11.92 | 6.92 | 5.75 |
| West Central Florida | 11.70 | 13.31 | 5.00 |
| Total | 11.98 | 9.46 | 5.42 |
Average Mandatory Tour Lengths
| Home District | Work | University | School |
|---|---|---|---|
| Central Florida | 12.94 | 9.18 | 5.56 |
| Northeast Florida | 12.43 | 8.11 | 6.18 |
| Northwest Florida | 10.14 | 7.06 | 5.59 |
| South Florida | 11.23 | 7.77 | 5.31 |
| Southeast Florida | 12.54 | 11.39 | 5.69 |
| Southwest Florida | 12.63 | 10.62 | 5.63 |
| West Central Florida | 13.34 | 10.00 | 5.94 |
| Total | 12.42 | 9.18 | 5.68 |
| Purpose | HTS | MODEL |
|---|---|---|
| Escorting | 5.60 | 6.12 |
| Maintenance | 6.19 | 6.49 |
| Discretionary | 6.11 | 6.60 |
| At-Work | 5.11 | 5.40 |
| Total | 6.01 | 6.42 |
Tour Mode Choice
Results of Tour Mode Choice Models, which selects a primary mode for each tour.
Distribution of tours by tour mode and the ratio of autos to drivers in the household.
| _______________________________________________________ | ||
| Tour_Purpose | HTS | MODEL |
|---|---|---|
| Work | 5 | 5.00762253955349 |
| University | 4 | 3.72446971036283 |
| School | 4 | 4.40912621719298 |
| Escorting | 4 | 4.37791850712329 |
| Maintenance | 4 | 3.76581031046531 |
| Discretionary | 4 | 3.94088397240201 |
| Total | 4 | 4.26336293677338 |
Trip Mode Choice
The results of the Trip Mode Choice Model, which predicts the mode of each trip on the tour.
Distribution of trips by trip mode and tour mode, which constrains the availability of each trip mode and influences the utility of each available trip mode.
---
title: "`r paste(BASE_SCENARIO_NAME, 'vs.', BUILD_SCENARIO_NAME, 'Calibration Summary')`"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
theme: spacelab
social: menu
source_code: embed
---
<!-- ```{r Setup} -->
<!-- opts_knit$set(root.dir = SYSTEM_APP_PATH) -->
<!-- ``` -->
<!-- ```{r setpar} -->
<!-- knitr::opts_knit$set(global.par = TRUE) -->
<!-- ``` -->
```{r ggplot_Theme}
theme_db <- theme_bw() + theme(plot.margin = unit(c(10,10,20,10),"pt"))
```
```{r Helper_Functions}
compare_bar_plotter <- function(base, build, base_name, build_name, xvar, yvar,
xlabel = xvar, ylabel = yvar, position = "dodge",
xrotate = FALSE, yrotate = FALSE, coord_flip = FALSE,
title = "", left_offset = 0, bottom_offset = 0){
base$grp <- base_name
build$grp <- build_name
colnames(build) <- colnames(base)
df <- rbind(base, build)
p <- ggplot(df, aes_string(x = xvar, y = yvar)) +
geom_bar(stat = "identity", aes(fill = grp), position = position) +
xlab(xlabel) + ylab(ylabel) +
labs(fill = "") +
ggtitle(title) +
theme(axis.text.x=element_text(angle=50, size=1, vjust=0.5)) +
theme(axis.text.y=element_text(angle=50, size=1, vjust=0.5)) +
theme_bw()
if (xrotate) {
p <- p + theme(axis.text.x = element_text(angle = 45, hjust = 1))
}
if (yrotate) {
p <- p + theme(axis.text.y = element_text(angle = 45, hjust = 1))
}
if (coord_flip) {
p <- p + coord_flip()
}
p <- plotly_build(p)
p$layout$margin$l <- p$layout$margin$l+left_offset
p$layout$margin$b <- p$layout$margin$b+bottom_offset
return(p)
}
# This function combines two dataframes and returns a data frame with standard field names
# The field names in the two dataframes should be same and should be same as the variable
# names passed to the function
# input parameter - dataframe1, dataframe2, x variable, list of y variables
# renames x and y variables in standard form - xvar, (yvar1, yvar2),...
# Y variables are named in pairs - (yvar1, yvar2), (yvar3, yvar4), ....
# yvar1, yvar3, .. correspond to first dataframe and yvar2, yvar4, .. correspond to second dataframe
# computes proportions for each y variable variable
get_standardDF <- function(data_df1, data_df2, x, y, grp = "", shared = F){
#data_df1=base_df
#data_df2=build_df
#x="id"
#y = c("freq_out", "freq_inb")
#grp = "purpose"
#shared = T
#
# create ID variable to join base and build data
if(!shared){
ev1 <- paste("data_df1$id_var <- data_df1$", x, sep = "")
ev2 <- paste("data_df2$id_var <- data_df2$", x, sep = "")
eval(parse(text = ev1))
eval(parse(text = ev2))
}else{
if(grp==""){
stop("group variable not specified")
}else{
ev1 <- paste("data_df1$id_var <- paste(data_df1$", grp, ", data_df1$", x, ', sep = "")', sep = "")
ev2 <- paste("data_df2$id_var <- paste(data_df2$", grp, ", data_df2$", x, ', sep = "")', sep = "")
eval(parse(text = ev1))
eval(parse(text = ev2))
}
}
data_df <- data_df1
# rename variables to standard names
names(data_df)[names(data_df) == x] <- 'xvar'
if(shared){
if(grp==""){
stop("group variable not specified")
}else{
names(data_df)[names(data_df) == grp] <- 'grp_var'
}
}
for(i in seq(from=1, to=length(y))){
start_pos <- i*2-1
yvar1 <- paste('yvar', start_pos, sep = "")
yvar2 <- paste('yvar', start_pos+1, sep = "")
names(data_df)[names(data_df) == y[[i]]] <- paste('yvar', start_pos, sep = "")
eval_expr <- paste("data_df$", yvar2, " <- data_df2$", y[[i]], "[match(data_df$id_var, data_df2$id_var)]", sep = "")
eval(parse(text = eval_expr))
}
data_df[is.na(data_df)] <- 0
#data_df$grp_var <- as.character(data_df$grp_var)
# compute proportions for y variables
for(i in seq(from=1, to=length(y))){
start_pos <- i*2-1
prop_var1 <- paste('prop', start_pos, sep = "")
y_var1 <- paste('yvar', start_pos, sep = "")
prop_var2 <- paste('prop', start_pos+1, sep = "")
y_var2 <- paste('yvar', start_pos+1, sep = "")
if(shared){
if(grp==""){
stop("group variable not specified")
}else{
eval_expr1 <- paste("data_df <- data_df %>% group_by(grp_var) %>% mutate(", prop_var1, " = prop.table(", y_var1, "))", sep = "")
eval_expr2 <- paste("data_df <- data_df %>% group_by(grp_var) %>% mutate(", prop_var2, " = prop.table(", y_var2, "))", sep = "")
}
}else{
eval_expr1 <- paste("data_df <- data_df %>% mutate(", prop_var1, " = prop.table(", y_var1, "))", sep = "")
eval_expr2 <- paste("data_df <- data_df %>% mutate(", prop_var2, " = prop.table(", y_var2, "))", sep = "")
}
eval(parse(text = eval_expr1))
eval(parse(text = eval_expr2))
}
# set all NAs to zero
data_df[is.na(data_df)] <- 0
if(!shared){
return(data_df)
}else{
data_sd <- SharedData$new(data_df, ~grp_var)
return(data_sd)
}
}
# This function returns a SharedData object for creating comparison density plots
# input parameter - dataframe1, dataframe2, x variable, list of y variables,
# grouping variable, names of each run
# The function expects same field names across both dataframes
# renames x and y variables in standard form - xvar, yvar1, yvar2,...
# computes proportions for each y variable variable for each group and run
# combines two dataframe and adds a run identifier
get_sharedData <- function(data_df1, data_df2, run1_name = 'base', run2_name = 'build',
x, y, grp){
# rename variables to standard names
names(data_df1)[names(data_df1) == x] <- 'xvar'
names(data_df1)[names(data_df1) == grp] <- 'grp_var'
for(i in 1:length(y)){
names(data_df1)[names(data_df1) == y[[i]]] <- paste('yvar', i, sep = "")
}
names(data_df2)[names(data_df2) == x] <- 'xvar'
names(data_df2)[names(data_df2) == grp] <- 'grp_var'
for(i in 1:length(y)){
names(data_df2)[names(data_df2) == y[[i]]] <- paste('yvar', i, sep = "")
}
# compute proportions for y variables
data_df1 <- group_by(data_df1, grp_var)
for(i in 1:length(y)){
prop_var <- paste('prop', i, sep = "")
y_var <- paste('yvar', i, sep = "")
eval_expr <- paste("data_df1 <- data_df1 %>% mutate(", prop_var, " = prop.table(", y_var, "))", sep = "")
eval(parse(text = eval_expr))
}
data_df2 <- group_by(data_df2, grp_var)
for(i in 1:length(y)){
prop_var <- paste('prop', i, sep = "")
y_var <- paste('yvar', i, sep = "")
eval_expr <- paste("data_df2 <- data_df2 %>% mutate(", prop_var, " = prop.table(", y_var, "))", sep = "")
eval(parse(text = eval_expr))
}
# add run identifiers
data_df1$run <- run1_name
data_df2$run <- run2_name
# combine dataframes
data_df <- rbind(data_df1, data_df2)
# set all NAs to zero
data_df[is.na(data_df)] <- 0
data_sd <- SharedData$new(data_df, ~grp_var)
return(data_sd)
}
# This function returns bar plot for a given X-Y data frame
# The function expects the data frame columns to be named as
# xvar, yvar1, yvar2...
# function plots only two series at a time
# which two y series to plot is determined by the index variable
# index==1 :- yvar1, yvar2, index==2 :- yvar,3,4 and so on
# names of series to be plotted should also be passed as a list argument
# number of elements in names list determines the number of series to be added
plotly_bar_plotter <- function(data, type = 'bar', xlabel = "", ylabel = "", percent = FALSE,
title = "", height = 0, width = 0, ynames = c(""), left_offset = 0,
bottom_offset = 0, tickformat = "", hoverformat = "", tickangle = 0, index = 1, tickvals = c(), ticktext = c()){
#initial setup
start_pos <- 2*index - 1
exp_tickvals <- ifelse(length(tickvals)>0, ', tickvals = tickvals', "")
exp_ticktext <- ifelse(length(ticktext)>0, ', ticktext = ticktext', "")
#generate plot
if(!percent){
ylab <- ifelse(ylabel=="", "Percent", ylabel)
hformat <- ifelse(hoverformat=="", '.1f', hoverformat)
eval_expr <- paste("p <- plot_ly(data, x = ~xvar, y = ~yvar", start_pos, ", type = type, name = ynames[[1]]) %>% ",
"add_trace(y = ~yvar", start_pos+1, ", name = ynames[[2]]) %>% ",
"layout(yaxis = list(hoverformat = hformat, title = ylab, tickformat = tickformat), xaxis = list(title = xlabel, tickangle = tickangle", exp_tickvals, exp_ticktext, "), barmode = 'group')", sep = "")
eval(parse(text = eval_expr))
}else{
ylab <- ifelse(ylabel=="", "Frequency", ylabel)
hformat <- ifelse(hoverformat=="", '.1%', hoverformat)
eval_expr <- paste("p <- plot_ly(data, x = ~xvar, y = ~prop", start_pos, ", type = type, name = ynames[[1]]) %>% ",
"add_trace(y = ~prop", start_pos+1, ", name = ynames[[2]]) %>% ",
"layout(yaxis = list(hoverformat = hformat, title = ylab, tickformat = '%'), xaxis = list(title = xlabel, tickangle = tickangle", exp_tickvals, exp_ticktext,"), barmode = 'group')", sep = "")
eval(parse(text = eval_expr))
}
p$x$layout$height <- height
p$x$layout$width <- width
p$x$layout$margin$b <- p$x$layout$margin$b + bottom_offset
p$x$layout$margin$l <- p$x$layout$margin$l + left_offset
return(p)
}
# This function returns a spline plot with fill for a gievn X-Y dataframe
# The function expects the data frame columns to be named as
# x = ~xvar, y = (~yvar1 or prop1), (~yvar2 or prop2) adn so on (Frequency or Percent),
# which y to use is determined by index parameter (one, two or three)
# and variable differentiating runs as ~run
# The function currebtly plots only one Y variables for each run
plotly_density_plotter <- function(data_df, index = "one", colors=c("steelblue", "orange"), fill = 'tozeroy',
title = "", xlabel = "", ylabel = "", percent = T, alpha = 0.7, tickvals, ticktext, tickangle = 0,
height=400, left_offset = 0, bottom_offset = 0, shape = 'spline', legend = T){
##standardize data frame
#names(data_df)[names(data_df)==xvar] <- 'xvar'
#names(data_df)[names(data_df)==yvar] <- 'yvar1'
#names(data_df)[names(data_df)==prop_var] <- 'prop1'
#names(data_df)[names(data_df)==grp] <- 'run'
# prepare plot using standardized dataframe
if(percent){
ylab <- ifelse(ylabel=="", "Percent", ylabel)
p <- switch(index,
"one" = plot_ly(data=data_df,x = ~xvar, y = ~prop1, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab, tickformat = "%"), showlegend = legend),
"two" = plot_ly(data=data_df,x = ~xvar, y = ~prop2, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab, tickformat = "%"), showlegend = legend),
"three" = plot_ly(data=data_df,x = ~xvar, y = ~prop3, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab, tickformat = "%"), showlegend = legend)
)
}else{
ylab <- ifelse(ylabel=="", "Frequency", ylabel)
p <- switch(index,
"one" = plot_ly(data=data_df,x = ~xvar, y = ~yvar1, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab), showlegend = legend),
"two" = plot_ly(data=data_df,x = ~xvar, y = ~yvar2, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab), showlegend = legend),
"three" = plot_ly(data=data_df,x = ~xvar, y = ~yvar3, colors=c("steelblue", "orange"), color = ~run, fill=fill) %>%
add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
layout(title = "",xaxis = list(title=xlabel, tickvals = tickvals, ticktext = ticktext, tickangle = tickangle), yaxis = list(title=ylab), showlegend = legend)
)
#p <- plot_ly(data=data_df,x = ~xvar, y = ~yvar1, colors=c("steelblue", "orange"), color = ~run, height=400, fill=fill) %>%
#add_lines(name="",alpha=alpha, line = list(shape = shape)) %>%
#layout(title = "",xaxis = list(title=xlabel), yaxis = list(title=ylab))
}
p$x$layout$height <- height
p$x$layout$margin$b <- p$x$layout$margin$b + bottom_offset
p$x$layout$margin$l <- p$x$layout$margin$l + left_offset
return(p)
}
# This function returns a pie chart
# Input is a 2 column data frame with a label variable and a value variable
plotly_pie_chart <- function(data, label_var, value_var, title = "",
height = 0, width = 0, left_offset = 0,bottom_offset = 0, top_offset = 0, shared = F){
colors <- c('rgb(211,94,96)', 'rgb(128,133,133)', 'rgb(144,103,167)', 'rgb(171,104,87)', 'rgb(114,147,203)')
if(!shared){
names(data)[names(data)==label_var] <- 'label_var'
names(data)[names(data)==value_var] <- 'value_var'
p <- plot_ly(data, labels = ~label_var, values = ~value_var, type = 'pie',
textposition = 'outside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 2)),
showlegend = FALSE,
sort = FALSE) %>%
layout(title = title,
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
}else{
eval_expr <- paste("p <- plot_ly(data, labels = ~", label_var, ", values = ~", value_var, ", type = 'pie',
textposition = 'outside',
textinfo = 'label+percent',
insidetextfont = list(color = '#FFFFFF'),
marker = list(colors = colors,
line = list(color = '#FFFFFF', width = 2)),
showlegend = FALSE,
sort = FALSE) %>%
layout(title = title,
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))", sep = "")
eval(parse(text = eval_expr))
}
p$x$layout$height <- height
p$x$layout$width <- width
p$x$layout$margin$b <- p$x$layout$margin$b + bottom_offset
p$x$layout$margin$l <- p$x$layout$margin$l + left_offset
p$x$layout$margin$t <- p$x$layout$margin$t + top_offset
return(p)
}
lm_eqn <- function(df){
m <- lm(y ~ x - 1, df);
eq <- paste("Y = ", format(coef(m)[1], digits = 2), " * X , ", " r2 = ", format(summary(m)$r.squared, digits = 3), sep = "")
return(eq)
}
```
Welcome
============================================
Summary {data-width=150}
--------------------------------------------
### About this Document
This document is an interactive dashboard viewable from most modern internet browsers. The dashboard is a validation and diagnostics tool for CT-RAMP based Activity Based Models. Users can compare model performance against a household survey as part of a validation exercise or compare two model runs for sensitivity testing. All of the data, charts, and maps viewable in this dashboard are embedded directly into the HTML file. An internet connection is necessary for the best user experience, but is not required.
Users may navigate to different areas of the dashboard using the navigation bar at the top of the page, and may interact directly with most tables, charts, and maps.
This document is best viewed using the most recent versions of the following web browsers:
* [Google Chrome](https://www.google.com/chrome/browser/desktop/)
* [Microsoft Internet Explorer](https://www.microsoft.com/en-us/download/internet-explorer.aspx)
Note: Mozilla Firefox does not correctly render the images in this HTML file.
Summary {data-width=600}
--------------------------------------------
### Modeling Region
```{r model_region}
bins <- c(0, 10, 20, 50, 100, 200, 500, 1000, Inf)
# pal <- colorBin("YlOrRd", domain = zone_shp$HH, bins = bins)
# m <- leaflet(data = zone_shp)%>%
# addTiles() %>%
# addProviderTiles(providers$OpenStreetMap, group = "Background Map") %>%
# addLayersControl(
# overlayGroups = "Background Map", options = layersControlOptions(collapsed = FALSE)
# ) %>%
# addPolygons(weight = 0.5, opacity = 1)
# m
#
```
Overview
============================================
Base Highlights {data-width=90}
--------------------------------------------
###
```{r Run_Date1_ValueBox}
sample_rate <- ifelse(IS_BASE_SURVEY=="Yes", "-", paste(as.character(BASE_SAMPLE_RATE*100), "%"))
valueBox(BASE_SCENARIO_NAME, paste("Sample Rate: ", sample_rate, sep = ""), color = "DarkOrange")
base_pos <- which(base_csv_names=="totals")
base_df <- base_data[[base_pos]]
```
### Base Population
```{r Population1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_population"]/BASE_SAMPLE_RATE), big.mark = ","), "Population", icon = "ion-ios-people")
```
### Base Households
```{r Household1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_households"]/BASE_SAMPLE_RATE), big.mark = ","), "Households", icon = "glyphicon glyphicon-home")
```
### Base Tours
```{r Tours1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_tours"]/BASE_SAMPLE_RATE), big.mark = ","), "Total Tours", icon = "ion-refresh")
```
### Base Trips
```{r Trips1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_trips"]/BASE_SAMPLE_RATE), big.mark = ","), "Total Trips", icon = "ion-loop")
```
### Base Stops
```{r Stops1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_stops"]/BASE_SAMPLE_RATE), big.mark = ","), "Total Stops", icon = "ion-ios-location")
```
### Base Vehicle Trips
```{r VehTrips1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_vehtrips"]/BASE_SAMPLE_RATE), big.mark = ","), "Total Vehicle Trips", icon = "ion-loop")
```
### Base VMT
```{r VMT1_ValueBox}
valueBox(prettyNum(round(base_df$value[base_df$name=="total_vmt"]/BASE_SAMPLE_RATE), big.mark = ","), "Total VMT", icon = "ion-android-car")
```
Build Highlights {data-width=90}
--------------------------------------------
###
```{r Run_Date2_ValueBox}
valueBox(BUILD_SCENARIO_NAME, paste("Sample Rate: ", BUILD_SAMPLE_RATE*100, "%", sep = ""), color = "DarkOrange")
build_pos <- which(build_csv_names=="totals")
build_df <- build_data[[build_pos]]
```
### Build Population
```{r Population2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_population"]/BUILD_SAMPLE_RATE), big.mark = ","), "Population", icon = "ion-ios-people")
```
### Build Households
```{r Household2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_households"]/BUILD_SAMPLE_RATE), big.mark = ","), "Households", icon = "glyphicon glyphicon-home")
```
### Build Tours
```{r Tours2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_tours"]/BUILD_SAMPLE_RATE), big.mark = ","), "Total Tours", icon = "ion-refresh")
```
### Build Trips
```{r Trips2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_trips"]/BUILD_SAMPLE_RATE), big.mark = ","), "Total Trips", icon = "ion-loop")
```
### Build Stops
```{r Stops2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_stops"]/BUILD_SAMPLE_RATE), big.mark = ","), "Total Stops", icon = "ion-ios-location")
```
### Build Vehicle Trips
```{r VehTrips2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_vehtrips"]/BUILD_SAMPLE_RATE), big.mark = ","), "Total Vehicle Trips", icon = "ion-loop")
```
### Build VMT
```{r VMT2_ValueBox}
valueBox(prettyNum(round(build_df$value[build_df$name=="total_vmt"]/BUILD_SAMPLE_RATE), big.mark = ","), "Total VMT", icon = "ion-android-car")
```
Chart Column 1 {data-width=275}
--------------------------------------------
### Person Type Distribution
```{r Chart_Person_Type}
base_pos <- which(base_csv_names=="pertypeDistbn")
base_df <- base_data[[base_pos]]
base_df$PERNAME <- person_type_df$name_char[match(base_df$PERTYPE, person_type_df$code)]
base_df$PERNAME <- factor(base_df$PERNAME, levels = person_type_char)
build_pos <- which(build_csv_names=="pertypeDistbn")
build_df <- build_data[[build_pos]]
build_df$PERNAME <- person_type_df$name_char[match(build_df$PERTYPE, person_type_df$code)]
build_df$PERNAME <- factor(build_df$PERNAME, levels = person_type_char)
colnames(build_df) <- colnames(base_df)
std_DF <- get_standardDF(data_df1 = base_df, data_df2 = build_df, x = "PERNAME", y = c("freq"))
p <- plotly_bar_plotter(data = std_DF, xlabel = "Person Type", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, bottom_offset = 60, tickangle = -30)
p
```
### Household Size Distribution
```{r Chart_HHSize}
base_pos <- which(base_csv_names=="hhSizeDist")
base_df <- base_data[[base_pos]]
build_pos <- which(build_csv_names=="hhSizeDist")
build_df <- build_data[[build_pos]]
colnames(build_df) <- colnames(base_df)
std_DF <- get_standardDF(data_df1 = base_df, data_df2 = build_df, x = "HHSIZE", y = c("freq"))
p <- plotly_bar_plotter(data = std_DF, xlabel = "HH Size", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T)
p
```
Base Highlights2 {data-width=90}
--------------------------------------------
###
```{r Run_Date3_ValueBox}
valueBox(BASE_SCENARIO_NAME, "", color = "DarkOrange")
base_pos <- which(base_csv_names=="totals")
base_df <- base_data[[base_pos]]
```
### Tours per Person
```{r TourRate3_Gauge}
###if(IS_BASE_SURVEY=="Yes"){
###rate <- base_df$value[base_df$name=="total_tours"]/base_df$value[base_df$name=="total_population_for_rates"]
###}else{
rate <- base_df$value[base_df$name=="total_tours"]/base_df$value[base_df$name=="total_population"]
###}
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 2, gaugeSectors(danger = c(0,2), colors = c("Green", "Green", "Green")))
```
### Trips per Person
```{r TripRate3_Gauge}
###if(IS_BASE_SURVEY=="Yes"){
###rate <- base_df$value[base_df$name=="total_trips"]/base_df$value[base_df$name=="total_population_for_rates"]
###}else{
rate <- base_df$value[base_df$name=="total_trips"]/base_df$value[base_df$name=="total_population"]
###}
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 5, gaugeSectors(danger = c(0,5), colors = c("Green", "Green", "Green")))
```
### Stops per Person
```{r StopRate3_Gauge}
###if(IS_BASE_SURVEY=="Yes"){
###rate <- base_df$value[base_df$name=="total_stops"]/base_df$value[base_df$name=="total_population_for_rates"]
###}else{
rate <- base_df$value[base_df$name=="total_stops"]/base_df$value[base_df$name=="total_population"]
###}
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 2, gaugeSectors(danger = c(0,2), colors = c("Green", "Green", "Green")))
```
### Trips per Household
```{r TRate3_Gauge}
rate <- base_df$value[base_df$name=="total_trips"]/base_df$value[base_df$name=="total_households"]
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 15, gaugeSectors(danger = c(0,15), colors = c("Green", "Green", "Green")))
```
Build Highlights2 {data-width=90}
--------------------------------------------
###
```{r Run_Date4_ValueBox}
valueBox(BUILD_SCENARIO_NAME, "", color = "DarkOrange")
build_pos <- which(build_csv_names=="totals")
build_df <- build_data[[build_pos]]
```
### Tours per Person
```{r TourRate4_Gauge}
rate <- build_df$value[build_df$name=="total_tours"]/build_df$value[build_df$name=="total_population"]
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 2, gaugeSectors(danger = c(0,2), colors = c("Green", "Green", "Green")))
```
### Trips per Person
```{r TripRate4_Gauge}
rate <- build_df$value[build_df$name=="total_trips"]/build_df$value[build_df$name=="total_population"]
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 5, gaugeSectors(danger = c(0,5), colors = c("Green", "Green", "Green")))
```
### Stops per Person
```{r StopRate4_Gauge}
rate <- build_df$value[build_df$name=="total_stops"]/build_df$value[build_df$name=="total_population"]
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 2, gaugeSectors(danger = c(0,2), colors = c("Green", "Green", "Green")))
```
### Trips per Household
```{r TRate4_Gauge}
rate <- build_df$value[build_df$name=="total_trips"]/build_df$value[build_df$name=="total_households"]
gauge(prettyNum(round(rate, 2), big.mark = ","), min = 0, max = 15, gaugeSectors(danger = c(0,15), colors = c("Green", "Green", "Green")))
```
Long Term Models{data-navmenu="Long Term"}
============================================
Description {.sidebar data-width=225}
--------------------------------------------
**Auto Ownership - Total Vehicles**
Results of household auto ownership model, which predicts total number of vehicles per household.
**Auto Ownership - Autonomous Vehicles**
Results of household auto ownership model, which predicts number of autonomous vehicles per household.
**Work from Home**
Result of work from home choice model, which predicts whether workers have usual work place at home. These workers do not generate work tours, but can have non-mandatory tours.
**Mandatory TLFD**
Results of work and school location choice models.
Distribution of workers by distance between home and usual work place, and students by distance between home and school location.
Chart Column 1 {data-width=200}
--------------------------------------------
### Auto Ownership - Total Vehicles{data-height=150}
```{r Chart_Auto_Ownership}
# cat("Census source: ", AO_CENSUS_LONG)
base_pos <- which(base_csv_names=="autoOwnership")
base_df <- base_data[[base_pos]]
build_pos <- which(build_csv_names=="autoOwnership")
build_df <- build_data[[build_pos]]
colnames(build_df) <- colnames(base_df)
std_DF <- get_standardDF(data_df1 = base_df, data_df2 = build_df, x = "HHVEH", y = c("freq"))
p <- plotly_bar_plotter(data = std_DF, xlabel = "Number of Vehicles", ylabel = "Percent", ynames = c("ACS 1-Year", BUILD_SCENARIO_NAME), percent = T, height = 175)
p
```
### Percentage Working From Home{data-height=175}
```{r Chart_WFH}
base_df <- base_data[[which(base_csv_names=="wfh_summary")]]
base_df$share <- base_df$WFH/base_df$Workers
build_df <- build_data[[which(build_csv_names=="wfh_summary")]]
build_df$WFH[8] <- sum(build_df$WFH)
scale_up <- c(3, 1.5, 1.5, 2.4, 2.4, 2.4, 2.4, 2.4) # precovid
build_df$WFH <- scale_up * build_df$WFH
build_df$share <- build_df$WFH/build_df$Workers
std_DF <- cbind(base_df[,c("District", "share")], build_df[,c("share")])
colnames(std_DF) <- c("xvar", "prop1", "prop2")
p <- plotly_bar_plotter(data = std_DF, xlabel = "District", ylabel = "Percent WFH", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, height = 200)
p
```
Chart Column 2 {data-width=350}
--------------------------------------------
### Mandatory TLFD{data-height=475}
```{r mandatoryTLFD}
base_df1 <- base_data[[which(base_csv_names=="workTLFD")]]
base_df1 <- melt(base_df1, id = c("distbin"))
base_df2 <- base_data[[which(base_csv_names=="univTLFD")]]
base_df2 <- melt(base_df2, id = c("distbin"))
base_df3 <- base_data[[which(base_csv_names=="schlTLFD")]]
base_df3 <- melt(base_df3, id = c("distbin"))
base_df <- cbind(base_df1, base_df2$value, base_df3$value)
colnames(base_df) <- c("distbin","variable","value1","value2","value3")
build_df1 <- build_data[[which(build_csv_names=="workTLFD")]]
build_df1 <- melt(build_df1, id = c("distbin"))
build_df2 <- build_data[[which(build_csv_names=="univTLFD")]]
build_df2 <- melt(build_df2, id = c("distbin"))
build_df3 <- build_data[[which(build_csv_names=="schlTLFD")]]
build_df3 <- melt(build_df3, id = c("distbin"))
build_df <- cbind(build_df1, build_df2$value, build_df3$value)
colnames(build_df) <- c("distbin","variable","value1","value2","value3")
sd.purpose <- get_sharedData(data_df1 = base_df, data_df2 = build_df, run1_name = BASE_SCENARIO_NAME,
run2_name = BUILD_SCENARIO_NAME, x = "distbin", y = c("value1", "value2", "value3"), grp = "variable")
p1 <- plotly_density_plotter(sd.purpose, index = "one", xlabel = "Miles to Work", percent = T, tickvals = seq(1,40,5), ticktext = seq(0,40,5), height = 240)
p2 <- plotly_density_plotter(sd.purpose, index = "two", xlabel = "Miles to University", percent = T, tickvals = seq(1,40,5), ticktext = seq(0,40,5), height = 240)
p3 <- plotly_density_plotter(sd.purpose, index = "three", xlabel = "Miles to School", percent = T, tickvals = seq(1,40,5), ticktext = seq(0,40,5), height = 240)
bscols(widths=c(12),
list(filter_select("Purpose_County", "Select District", sd.purpose, ~grp_var,multiple=F),
p1,
p2,
p3)
)
```
Flows & Tour Lengths{data-navmenu="Long Term"}
============================================
Description {.sidebar data-width=150}
--------------------------------------------
**District-District Flow of Workers**
Crosstab of workers by home county and usual work place county.
Note: Districts can be Tract, County, District etc.
**Average Tour Lengths**
Average tour length to workplace by District of residence
Chart Column 1
--------------------------------------------
###{data-height=300}
```{r Table1_CountyFlows}
knitr::include_graphics(file.path(SYSTEM_JPEG_PATH,"model_acs_workerflow.png"))
```
### {data-height=280}
```{r Table1_MandTripLengths}
cat("Average Mandatory Tour Lengths")
base_df <- base_data[[which(base_csv_names=="mandTripLengths")]]
df <- base_df
df <- rbind(df[df$District!="Total",], df[df$District=="Total",])
colnames(df) <- c("Home District", "Work","University","School")
eval_expr <- paste("t1 <- kable(df, format = 'html', digits = 2, row.names = F, align = 'r', format.args = list(big.mark = ',')) %>%
kable_styling('striped', font_size = 11, full_width=F, position='center') %>%
add_header_above(c(' ' = 1, '", BASE_SCENARIO_NAME, "' = 3))", sep = "")
eval(parse(text = eval_expr))
t1
```
Chart Column 1
--------------------------------------------
###{data-height=300}
```{r Table2_CountyFlows}
knitr::include_graphics(file.path(SYSTEM_JPEG_PATH,"model_landuse_workLocation_TAZ.png"))
```
###{data-height=280}
```{r Table2_MandTripLengths}
cat("Average Mandatory Tour Lengths")
build_df <- build_data[[which(build_csv_names=="mandTripLengths")]]
df <- build_df
df <- rbind(df[df$DISTRICT!="Total",], df[df$DISTRICT=="Total",])
colnames(df) <- c("Home District", "Work","University","School")
eval_expr <- paste("t2 <- kable(df, format = 'html', digits = 2, row.names = F, align = 'r', format.args = list(big.mark = ',')) %>%
kable_styling('striped', font_size = 11, full_width=F, position='center') %>%
add_header_above(c(' ' = 1, '", BUILD_SCENARIO_NAME, "' = 3))", sep = "")
eval(parse(text = eval_expr))
t2
```
Tour Summaries{data-navmenu="Tour Level"}
============================================
Description {.sidebar data-width=225}
--------------------------------------------
This page summarizes day-pattern and tour generation model results.
**Daily Activity Pattern**
Results of Coordinated Daily Activity Pattern (CDAP) model, summarized for each person.
_M_ : One or more mandatory tours
_N_ : No mandatory tours but one or more non-mandatory tours
_H_ : No tours (either home all day or out of area)
**Mandatory Tour Frequency**
Result of the mandatory tour frequency model, summarized for each person with a daily activity pattern type _M_
**Tour rate by person type**
Summary of tours per person resulting from all tour generation models.
**Individual non-mandatory tour frequency**
Results of individual non-mandatory tour frequency model, summarized for each person with a daily activity pattern type _M_ or _N_.
Chart Column 1 {data-width=160}
--------------------------------------------
### Daily Activity Pattern{data-height=500}
```{r Hist_DAP}
base_df <- base_data[[which(base_csv_names=="dapSummary_vis")]]
base_df$PERNAME <- person_type_df$name_char[match(base_df$PERTYPE, person_type_df$code)]
base_df$PERNAME <- factor(base_df$PERNAME, levels = person_type_char)
base_df$DAP <- factor(base_df$DAP, levels = dap_types)
build_df <- build_data[[which(build_csv_names=="dapSummary_vis")]]
build_df$PERNAME <- person_type_df$name_char[match(build_df$PERTYPE, person_type_df$code)]
build_df$PERNAME <- factor(build_df$PERNAME, levels = person_type_char)
build_df$DAP <- factor(build_df$DAP, levels = dap_types)
base_df$grp <- BASE_SCENARIO_NAME
build_df$grp <- BUILD_SCENARIO_NAME
colnames(build_df) <- colnames(base_df)
sd.pertype <- get_standardDF(data_df1=base_df, data_df2=build_df, x="DAP", y = c("freq"), grp = "PERNAME", shared = T)
p <- plotly_bar_plotter(data = sd.pertype, height = 250, xlabel = "DAP", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T)
bscols(widths=c(3,9),
list(
filter_select("pertype_dap", "Select Person Type", sd.pertype, ~grp_var,multiple=F)),
p
)
```
### Mandatory Tour Frequency{data-height=500}
```{r Hist_MTF}
base_pos <- which(base_csv_names=="mtfSummary_vis")
base_df <- base_data[[base_pos]]
base_df$PERNAME <- person_type_df$name_char[match(base_df$PERTYPE, person_type_df$code)]
base_df$PERNAME <- factor(base_df$PERNAME, levels = person_type_char)
base_df$mtf_name <- mtf_df$name[match(base_df$MTF, mtf_df$code)]
base_df$mtf_name <- factor(base_df$mtf_name, levels = mtf_names)
build_pos <- which(build_csv_names=="mtfSummary_vis")
build_df <- build_data[[build_pos]]
build_df$PERNAME <- person_type_df$name_char[match(build_df$PERTYPE, person_type_df$code)]
build_df$PERNAME <- factor(build_df$PERNAME, levels = person_type_char)
build_df$mtf_name <- mtf_df$name[match(build_df$MTF, mtf_df$code)]
build_df$mtf_name <- factor(build_df$mtf_name, levels = mtf_names)
colnames(build_df) <- colnames(base_df)
sd.pertype <- get_standardDF(data_df1=base_df, data_df2=build_df, x="mtf_name", y = c("freq"), grp = "PERNAME", shared = T)
p <- plotly_bar_plotter(data = sd.pertype, height = 250, xlabel = "MTF Choice", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickangle = -30, bottom_offset = 50)
bscols(widths=c(3,9),
list(
filter_select("pertype_mtf", "Select Person Type", sd.pertype, ~grp_var,multiple=F)),
p
)
```
Chart Column 1 {data-width=150}
--------------------------------------------
### Total Tour Rate (only active Persons)
```{r Hist_totaltours}
base_df <- base_data[[which(base_csv_names=="total_tours_by_pertype_vis")]]
base_df$PERNAME <- person_type_df$name_char[match(base_df$PERTYPE, person_type_df$code)]
base_df$PERNAME <- factor(base_df$PERNAME, levels = person_type_char)
base_df1 <- base_data[[which(base_csv_names=="activePertypeDistbn")]]
base_df$persons <- base_df1$freq[match(base_df$PERTYPE, base_df1$PERTYPE)]
base_df$tourrate <- round(base_df$freq/base_df$persons,2)
build_df <- build_data[[which(build_csv_names=="total_tours_by_pertype_vis")]]
build_df$PERNAME <- person_type_df$name_char[match(build_df$PERTYPE, person_type_df$code)]
build_df$PERNAME <- factor(build_df$PERNAME, levels = person_type_char)
build_df1 <- build_data[[which(build_csv_names=="activePertypeDistbn")]]
build_df$persons <- build_df1$freq[match(build_df$PERTYPE, build_df1$PERTYPE)]
build_df$tourrate <- round(build_df$freq/build_df$persons,2)
colnames(build_df) <- colnames(base_df)
std_DF <- get_standardDF(data_df1 = base_df, data_df2 = build_df, x = "PERNAME", y = c("tourrate"))
p <- plotly_bar_plotter(data = std_DF, xlabel = "Person Type", ylabel = "Tour Rate", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = F, height = 340, tickangle = -30, bottom_offset = 50)
p
```
### Persons by Individual Non-Mandatory Tours
```{r Hist_INM}
base_df <- base_data[[which(base_csv_names=="inmSummary_vis")]]
base_df$PERNAME <- person_type_df$name_char[match(base_df$PERTYPE, person_type_df$code)]
base_df$PERNAME <- factor(base_df$PERNAME, levels = person_type_char)
build_df <- build_data[[which(build_csv_names=="inmSummary_vis")]]
build_df$PERNAME <- person_type_df$name_char[match(build_df$PERTYPE, person_type_df$code)]
build_df$PERNAME <- factor(build_df$PERNAME, levels = person_type_char)
colnames(build_df) <- colnames(base_df)
sd.pertype <- get_standardDF(data_df1=base_df, data_df2=build_df, x="nmtours", y = c("freq"), grp = "PERNAME", shared = T)
#p <- plotly_bar_plotter(data = sd.pertype, height = 340, xlabel = "Number of Tours", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, #BUILD_SCENARIO_NAME), percent = T, tickvals = c(seq(0,2), "3pl"), ticktext = c("0", "1", "2", "3pl"))
p <- plotly_bar_plotter(data = sd.pertype, height = 340, xlabel = "Number of Tours", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T)
bscols(widths=c(3,9),
list(
filter_select("pertype_mtf", "Select Person Type", sd.pertype, ~grp_var,multiple=F)),
p
)
```
Destination{data-navmenu="Tour Level"}
============================================
Description {.sidebar data-width=225}
--------------------------------------------
********
**Non-Mandatory Tour Length Distribution**
Results of non-mandatory tour destination choice models.
Distribution of tours by distance between tour origin and destination for each non-mandatory tour purpose.
Chart Column 1 {data-width=100}
--------------------------------------------
### Non-Mandatory Tour Length Distribution{data-height=350}
```{r nm_tlfd}
base_df <- base_data[[which(base_csv_names=="tourDistProfile_vis")]]
build_df <- build_data[[which(build_csv_names=="tourDistProfile_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$PURPOSE <- as.character(base_df$PURPOSE)
build_df$PURPOSE <- as.character(build_df$PURPOSE)
base_df$PURPOSE <- purpose_type_df$name[match(base_df$PURPOSE, purpose_type_df$code)]
build_df$PURPOSE <- purpose_type_df$name[match(build_df$PURPOSE, purpose_type_df$code)]
sd.purpose <- get_sharedData(data_df1 = base_df, data_df2 = build_df, run1_name = BASE_SCENARIO_NAME,
run2_name = BUILD_SCENARIO_NAME, x = "distbin", y = c("freq"), grp = "PURPOSE")
p1 <- plotly_density_plotter(sd.purpose, index = "one", xlabel = "Miles", percent = T,
tickvals = seq(2,41), ticktext = c(seq(1,40), "40pl"))
bscols(widths=c(2,10),
filter_select("Tour Purpose", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F),
p1
)
```
### Average Non-Mandatory Tour Lengths (Miles){data-height=250}
```{r Table1_nonMandTripLength}
base_df <- base_data[[which(base_csv_names=="nonMandTripLengths")]]
build_df <- build_data[[which(build_csv_names=="nonMandTripLengths")]]
df <- data.frame(base_df, build_df[,-1])
colnames(df) <- c("Purpose", BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME)
df$Purpose <- purpose_type_df$name[match(df$Purpose, purpose_type_df$code)]
t1 <- kable(df, format = "html", digits = 2, row.names = F, align = 'c', format.args = list(big.mark = ',')) %>%
kable_styling("striped", full_width = F)
t1
```
TOD {data-navmenu="Tour Level"}
============================================
Description {.sidebar data-width=200}
--------------------------------------------
********
**Tour Departure Arrival & Duration**
Tour Time-of-day Choice Model results.
Each tour is assigned a time period of departure (time leaving home or work) and arrival (time arriving back at home or work). The entire day is divided into 40 half-hour bins (the first bin includes 3:00 AM to 5:00 AM and the last bin includes 12:00 PM to 3:00 AM).
Tour duration is calculated as a function of departure and arrival period. It includes travel time and time spent at the primary destination and all intermediate stops.
Results are shown for tours, filtered by tour purpose.
********
**Aggregate Tour Arrival-Departure**
_AM_: 6:00 AM to 9:00 AM
_MD_: 9:00 AM to 3:00 PM
_PM_: 3:00 PM to 7:00 PM
_EV_: 7:00 PM to 10:00 PM
_OV_: 10:00 PM to 3:00 AM
Chart Column 1 {.tabset}
--------------------------------------------
### Tour Departure-Arrival Profile
```{r tour_tod}
base_df <- base_data[[which(base_csv_names=="todProfile_vis")]]
base_df$tod_bin <- tod_df$bin[match(base_df$id, tod_df$id)]
base_df$dur_bin <- dur_df$bin[match(base_df$id, dur_df$id)]
build_df <- build_data[[which(build_csv_names=="todProfile_vis")]]
build_df$tod_bin <- tod_df$bin[match(build_df$id, tod_df$id)]
build_df$dur_bin <- dur_df$bin[match(build_df$id, dur_df$id)]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
base_df$freq_dep <- as.integer(base_df$freq_dep)
base_df$freq_arr <- as.integer(base_df$freq_arr)
base_df$freq_dur <- as.integer(base_df$freq_dur)
base_df <- base_df %>% filter(!is.na(tod_bin))
build_df <- build_df %>% filter(!is.na(tod_bin))
sd.purpose <- get_sharedData(data_df1 = base_df, data_df2 = build_df, run1_name = BASE_SCENARIO_NAME,
run2_name = BUILD_SCENARIO_NAME, x = "id", y = c("freq_dep", "freq_arr", "freq_dur"), grp = "purpose")
p1 <- plotly_density_plotter(sd.purpose, index = "one", xlabel = "Tour Departure", percent = T, left_offset = 25,
tickvals = seq(1,40), ticktext = todBins, bottom_offset = 150, tickangle = 315, height = 275)
p2 <- plotly_density_plotter(sd.purpose, index = "two", xlabel = "Tour Arrival", percent = T, left_offset = 25,
tickvals = seq(1,40), ticktext = todBins, bottom_offset = 150, tickangle = 315, height = 275)
p3 <- plotly_density_plotter(sd.purpose, index = "three", xlabel = "Tour Duraction", percent = T, left_offset = 25,
tickvals = seq(1,40), ticktext = durBins, bottom_offset = 50, tickangle = 315, height = 225)
bscols(widths=c(2,10),
filter_select("Tour Purpose", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F),
list(p1, p2, p3)
)
```
### Tour Aggregate Departure-Arrival Profile
```{r tour_tod_agg}
base_df <- base_data[[which(base_csv_names=="todProfile_vis")]]
base_df$tod_agg <- cut(base_df$id, breaks = timePeriodBreaks, labels = timePeriods, right = FALSE)
levels(base_df$tod_agg) <- c("OV","AM","MD","PM","EV","OV")
base_df <- base_df %>%
group_by(purpose, tod_agg) %>%
summarise(freq_dep = sum(freq_dep), freq_arr = sum(freq_arr), freq_dur = sum(freq_dur)) %>%
ungroup()
build_df <- build_data[[which(build_csv_names=="todProfile_vis")]]
build_df$tod_agg <- cut(build_df$id, breaks = timePeriodBreaks, labels = timePeriods, right = FALSE)
levels(build_df$tod_agg) <- c("OV","AM","MD","PM","EV","OV")
build_df <- build_df %>%
group_by(purpose, tod_agg) %>%
summarise(freq_dep = sum(freq_dep), freq_arr = sum(freq_arr), freq_dur = sum(freq_dur)) %>%
ungroup()
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.purpose <- get_standardDF(data_df1=base_df, data_df2=build_df, x="tod_agg", y = c("freq_dep", "freq_arr", "freq_dur"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.purpose, height = 350, xlabel = "Tour Departure", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T)
p2 <- plotly_bar_plotter(data = sd.purpose, height = 350, xlabel = "Tour Arrival", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, index = 2)
bscols(widths=c(2,10),
filter_select("Tour Purpose", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F),
list(p1, p2)
)
```
Tour Mode{data-navmenu="Tour Level"}
============================================
Chart Column 1{data-width=150}
--------------------------------------------
### Tour Mode Choice
```{r tourMode}
base_df <- base_data[[which(base_csv_names=="tmodeProfile_vis")]]
base_df$purpose <- as.character(base_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df <- build_data[[which(build_csv_names=="tmodeProfile_vis")]]
build_df$purpose <- as.character(build_df$purpose)
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
colnames(build_df) <- colnames(base_df)
sd.pertype <- get_standardDF(data_df1=base_df, data_df2=build_df, x="id", y = c("freq_as0", "freq_as1", "freq_as2", "freq_all"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.pertype, height = 375, xlabel = "Tour Mode [Zero Auto]", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,13), ticktext = tourMode, bottom_offset = 55, tickangle = 300)
p2 <- plotly_bar_plotter(data = sd.pertype, height = 375, xlabel = "Tour Mode [Autos < HH Adults]", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,13), ticktext = tourMode, index = 2, bottom_offset = 55, tickangle = 300)
p3 <- plotly_bar_plotter(data = sd.pertype, height = 375, xlabel = "Tour Mode [Autos >= HH Adults]", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,13), ticktext = tourMode, index = 3, bottom_offset = 55, tickangle = 300)
p4 <- plotly_bar_plotter(data = sd.pertype, height = 375, xlabel = "Tour Mode [Total]", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,13), ticktext = tourMode, index = 4, bottom_offset = 55, tickangle = 300)
filter_select("tourMode", "Select Tour Purpose", sd.pertype, ~grp_var,multiple=F)
```
********
**Tour Mode Choice**
Results of Tour Mode Choice Models, which selects a primary mode for each tour.
Distribution of tours by tour mode and the ratio of autos to drivers in the household.
Chart Column 2 {data-width=400}
--------------------------------------------
###
```{r tourMode2}
bscols(widths=c(12),
list(p1,p2)
)
```
Chart Column 3 {data-width=400}
--------------------------------------------
###
```{r tourMode3}
bscols(widths=c(12),
list(p3,p4)
)
```
Stop Frequency {data-navmenu="Trip Level"}
============================================
Description {.sidebar data-width=175}
--------------------------------------------
********
**Stop Frequency**
Results of the Intermediate Stop Frequency Model, which predicts the number of intermediate stops on each tour by tour direction (outbound versus inbound).
The summary shows percent of tours by number of stops on the tour and tour direction.
**Stop Purpose**
Results of the Intermediate Stop Purpose Model, which is currently implemented as a Monte Carlo choice according to probability distributions generated from survey data.
The summary shows the percent of intermediate stops by stop purpose and tour purpose.
Chart Column 1 {data-width=200}
--------------------------------------------
### Stop Frequency - Directional
```{r stopfreq_dir}
base_df <- base_data[[which(base_csv_names=="stopfreqDir_vis")]]
build_df <- build_data[[which(build_csv_names=="stopfreqDir_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.pertype1 <- get_standardDF(data_df1=base_df, data_df2=build_df, x="nstops", y = c("freq_out", "freq_inb"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.pertype1, height = 325, xlabel = "Number of Stops - Outbound", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,4), ticktext = c("0", "1", "2", "3pl"))
p2 <- plotly_bar_plotter(data = sd.pertype1, height = 325, xlabel = "Number of Stops - Inbound", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,4), ticktext = c("0", "1", "2", "3pl"), index = 2)
bscols(widths=c(12),
list(
filter_select("stopfreq_dir", "Select Tour Purpose", sd.pertype1, ~grp_var,multiple=F),
p1,
p2)
)
```
Chart Column 1 {data-width=300}
--------------------------------------------
### Stop Frequency - Total{data-height=250}
```{r stopfreq_total}
base_df <- base_data[[which(base_csv_names=="stopfreq_total_vis")]]
build_df <- build_data[[which(build_csv_names=="stopfreq_total_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.pertype2 <- get_standardDF(data_df1=base_df, data_df2=build_df, x="nstops", y = c("freq"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.pertype2, height = 350, xlabel = "Number of Stops", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,6), ticktext = c("0", "1", "2", "3", "4", "5", "6pl"))
bscols(widths=c(3,9),
list(
filter_select("stopfreq_total", "Select Tour Purpose", sd.pertype2, ~grp_var,multiple=F)),
p1
)
```
### Stop Purpose by Tour Purpose{data-height=250}
```{r stoppurp_tourpurp}
base_df <- base_data[[which(base_csv_names=="stoppurpose_tourpurpose_vis")]]
build_df <- build_data[[which(build_csv_names=="stoppurpose_tourpurpose_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.pertype3 <- get_standardDF(data_df1=base_df, data_df2=build_df, x="stop_purp", y = c("freq"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.pertype3, height = 350, xlabel = "Stop Purpose", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,10), ticktext = stopPurposes)
bscols(widths=c(3,9),
list(
filter_select("stoppurp_tourpurp", "Select Tour Purpose", sd.pertype3, ~grp_var,multiple=F)),
p1
)
```
Location{data-navmenu="Trip Level"}
============================================
Description {.sidebar data-width=175}
--------------------------------------------
********
**Stop Location**
Results of the Intermediate Stop Location Choice Model, which predicts the location of each intermediate stop.
The summary shows the distribution of intermediate stops by out of direction distance and tour purpose.
Out of direction distance is defined as the extra distance to the destination as a result of traveling through the stop location.
For stops in the outbound direction, it is based on the distance between the last known location (the tour origin or previous outbound stop) and the tour primary destination.
For stops in the inbound direction, it is based on the distance between the last known location (the tour primary destination or previous inbound stop) and the tour origin.
Chart Column 1 {data-width=800}
--------------------------------------------
### Stop Location - Out of Direction Distance{data-height=350}
```{r stopDC}
base_df <- base_data[[which(base_csv_names=="stopDC_vis")]]
build_df <- build_data[[which(build_csv_names=="stopDC_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$PURPOSE <- as.character(base_df$PURPOSE)
build_df$PURPOSE <- as.character(build_df$PURPOSE)
base_df$PURPOSE <- purpose_type_df$name[match(base_df$PURPOSE, purpose_type_df$code)]
build_df$PURPOSE <- purpose_type_df$name[match(build_df$PURPOSE, purpose_type_df$code)]
sd.purpose <- get_sharedData(data_df1 = base_df, data_df2 = build_df, run1_name = BASE_SCENARIO_NAME,
run2_name = BUILD_SCENARIO_NAME, x = "distbin", y = c("freq"), grp = "PURPOSE")
p1 <- plotly_density_plotter(sd.purpose, index = "one", xlabel = "Out of Direction Distance (Miles)", percent = T, left_offset = 25,
tickvals = seq(1,42), ticktext = outDirDist, height = 600, tickangle = 300, bottom_offset = 50)
bscols(widths=c(12),
list(
filter_select("stopDC", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F), p1)
)
```
Chart Column 1 {data-width=300}
--------------------------------------------
### Average Out of Direction Distance (Miles){data-height=250}
```{r Table1_outOfDir}
base_df <- base_data[[which(base_csv_names=="avgStopOutofDirectionDist_vis")]]
build_df <- build_data[[which(build_csv_names=="avgStopOutofDirectionDist_vis")]]
df <- data.frame(base_df, build_df[,-1])
colnames(df) <- c("Tour_Purpose", BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME)
df$Tour_Purpose <- purpose_type_df$name[match(df$Tour_Purpose, purpose_type_df$code)]
#
#t1 <- kable(df, format = "html", digits = 2, row.names = F, align = 'c', format.args = list(big.mark = ',')) %>%
# kable_styling("striped", full_width = F)
t1 <- htmlTable(txtRound(df, 2),
align = "c|r",
rnames = F,
col.columns = c(rep("#E6E6F0", 1),
rep("none", ncol(df) - 1)),
caption = "_______________________________________________________")
t1
```
TOD{data-navmenu="Trip Level"}
============================================
Description {.sidebar data-width=175}
--------------------------------------------
********
**Stop Departure**
Results of the Stop Departure Time Choice Model. The departure time of each stop on the tour is currently implemented as a Monte Carlo choice of time period from distributions generated from survey data.
The entire day is divided into 40 half-hour bins (The first bin includes 3:00 AM to 5:00 AM and the last bin includes 12:00 PM to 3:00 AM).
**Trip Departure**
Summarizes all trips by departure time period, including trips to and from intermediate stops and the tour primary destination.
Chart Column 1 {.tabset}
--------------------------------------------
### Stop & Trip Departure{data-height=650}
```{r stopDep}
base_df <- base_data[[which(base_csv_names=="stopTripDep_vis")]]
build_df <- build_data[[which(build_csv_names=="stopTripDep_vis")]]
colnames(base_df) <- c("timebin", "purpose", "freq_stop", "freq_trip")
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.purpose <- get_sharedData(data_df1 = base_df, data_df2 = build_df, run1_name = BASE_SCENARIO_NAME,
run2_name = BUILD_SCENARIO_NAME, x = "timebin", y = c("freq_stop", "freq_trip"), grp = "purpose")
p1 <- plotly_density_plotter(sd.purpose, index = "one", xlabel = "Stop Departure", percent = T, left_offset = 25,
tickvals = seq(1,40), ticktext = todBins, bottom_offset = 150, tickangle = 315, height = 400)
p2 <- plotly_density_plotter(sd.purpose, index = "two", xlabel = "Trip Departure", percent = T, left_offset = 25,
tickvals = seq(1,40), ticktext = todBins, bottom_offset = 150, tickangle = 315, height = 400)
#p3 <- datatable(sd.purpose$data())
bscols(widths=c(2,10),
filter_select("Tour Purpose", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F),
list(p1, p2)
)
```
### Aggregate Stop & Trip Departure
```{r trip_tod_agg}
base_df <- base_data[[which(base_csv_names=="stopTripDep_vis")]]
colnames(base_df) <- c("id","purpose","freq_stop","freq_trip")
base_df$tod_agg <- cut(base_df$id, breaks = timePeriodBreaks, labels = timePeriods, right = FALSE)
levels(base_df$tod_agg) <- c("OV","AM","MD","PM","EV","OV")
base_df <- base_df %>%
group_by(purpose, tod_agg) %>%
summarise(freq_stop = sum(freq_stop), freq_trip = sum(freq_trip)) %>%
ungroup()
build_df <- build_data[[which(build_csv_names=="stopTripDep_vis")]]
colnames(build_df) <- c("id","purpose","freq_stop","freq_trip")
build_df$tod_agg <- cut(build_df$id, breaks = timePeriodBreaks, labels = timePeriods, right = FALSE)
levels(build_df$tod_agg) <- c("OV","AM","MD","PM","EV","OV")
build_df <- build_df %>%
group_by(purpose, tod_agg) %>%
summarise(freq_stop = sum(freq_stop), freq_trip = sum(freq_trip)) %>%
ungroup()
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.purpose <- get_standardDF(data_df1=base_df, data_df2=build_df, x="tod_agg", y = c("freq_stop", "freq_trip"), grp = "purpose", shared = T)
p1 <- plotly_bar_plotter(data = sd.purpose, height = 350, xlabel = "Stop Departure", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T)
p2 <- plotly_bar_plotter(data = sd.purpose, height = 350, xlabel = "Trip Departure", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, index = 2)
bscols(widths=c(2,10),
filter_select("Tour Purpose", "Select Tour Purpose", sd.purpose, ~grp_var,multiple=F),
list(p1, p2)
)
```
Trip Mode{data-navmenu="Trip Level"}
============================================
Chart Column 1 {data-width=125}
--------------------------------------------
### {data-height=200}
***Trip Mode Choice***
The results of the Trip Mode Choice Model, which predicts the mode of each trip on the tour.
Distribution of trips by trip mode and tour mode, which constrains the availability of each trip mode and influences the utility of each available trip mode.
### Trip Mode Choice
```{r tripMode}
base_df <- base_data[[which(base_csv_names=="tripModeProfile_vis")]]
build_df <- build_data[[which(build_csv_names=="tripModeProfile_vis")]]
colnames(build_df) <- colnames(base_df)
# change purpose names to standard format
base_df$purpose <- as.character(base_df$purpose)
build_df$purpose <- as.character(build_df$purpose)
base_df$purpose <- purpose_type_df$name[match(base_df$purpose, purpose_type_df$code)]
build_df$purpose <- purpose_type_df$name[match(build_df$purpose, purpose_type_df$code)]
sd.purpose <- get_standardDF(data_df1=base_df, data_df2=build_df, x="tripmode", y = c("value"), grp = "grp_var", shared = T)
p <- plotly_bar_plotter(data = sd.purpose, height = 700, xlabel = "Trip Mode", ylabel = "Percent", ynames = c(BASE_SCENARIO_NAME, BUILD_SCENARIO_NAME), percent = T, tickvals = seq(1,13), ticktext = tripMode, bottom_offset = 75)
bscols(widths=c(12),
list(filter_select("tripMode1", "Select Tour Purpose", sd.purpose, ~purpose,multiple=F),
filter_select("tripMode1", "Select Tour Mode", sd.purpose, ~tourmode,multiple=F))
)
```
Chart Column 2 {data-width=800}
--------------------------------------------
###
```{r tripMode2}
bscols(widths=c(12),
list(p)
)
```
Count vs Volume{data-navmenu="Assignment"}
============================================
Description {.sidebar data-width=175}
--------------------------------------------
********
**Link level count comparison**
Results of auto assignment.
Comparison of observed counts and assigned volumes on each link with a counted volume, by assignment time period.
Chart Column 2{.tabset}
--------------------------------------------
### Count vs Volume by Facility Type{data-height=575}
```{r count_vol1}
```
### Count vs Volume - All Links{data-height=575}
```{r count_vol2}
```
### Gap Statistics{data-height=575}
```{r count_vol3}
```